package com.atguigu.bigdata.scala.chapter05

object Scala12_Function {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 递归
        // 阶乘 ： 一个大于1的数的阶乘等于这个数乘以这个数减一的阶乘
        // 5! = 5 * 4! = 5 * 4 * 3! = 5 * 4 * 3 * 2! = 5 * 4 * 3 * 2 * 1
        // 这里的阶乘采用递归的方式实现：
        // 1. 递归要求方法的逻辑中调用自身
        // 2. 递归函数中应该存在跳出的逻辑，否则会出现栈溢出错误
        // 3. 递归函数在调用时传递的参数之间有规律
        // 4. 递归函数需要明确返回值类型(Scala)

        // 函数式编程中，使用最多的算法就是递归

        // 阶乘的实现
        def testA( num : Int ):Int = {
            if ( num <= 1 ) {
                1
            } else {
                num * testA(num-1)
            }
        }

        println(testA(5))

        def test( num : Long ):Long = {
            if ( num <= 1 ) {
                1
            } else {
                num + test(num-1)
            }
        }

        // 递归即使存在跳出的逻辑，也会出现问题：
        // java.lang.StackOverflowError
        // 栈溢出错误 : 栈结构，压栈其实压的是栈帧，这里的栈帧指的是一块内存
        //            这里的结构，类似于数组，所以有容量的概念，10 * 1024K / 1K = 5 * 1024
        // 栈内存溢出错误 : 没有足够的内存空间分配栈
        //               栈不是只有一个，原则上来讲，一个线程就会分配一个栈内存
        // 堆内存溢出 ：堆空间无法分配更多的内存存放对象
        println(test(10000))

    }
}
